package src;


//import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.*;
import java.awt.print.PrinterException;
import java.awt.print.PrinterJob;
import java.io.*;
import java.util.ArrayList;
import java.util.HashMap;
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;

import panels.*;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author JMix
 */
public class JVentana extends JFrame implements ActionListener, KeyListener {
    
    JTabbedPane jtabbedPane;
    JToolBar toolbar;
    JPanelDibujo panelDibujo;
    JScrollPane scroller;
    VistaDatosRamo vistaDatosRamo;
    private ArrayList<Malla> mallas;
    private HashMap<Integer, JPanelDibujo> tabs;
    private Malla mallaSeleccionada;
    final Archivo archivo;
    private int identificador;
    
    public JVentana( String ruta ){
        super("Creador de mallas");
        super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        super.setLayout(new BorderLayout());
        super.setSize(800, 600);
        super.setMinimumSize(new Dimension(400, 300));
        super.setLocationRelativeTo(this);
        super.setIconImage(new ImageIcon(getClass().getResource("/images/typexy_16.png")).getImage());
        super.setFocusable(true);
        super.addKeyListener(this);
        this.tabs = new HashMap<>();
        this.identificador = 0;
        this.jtabbedPane = new JTabbedPane();
        jtabbedPane.addMouseListener(new MouseAdapter() {
            public void mousePressed(MouseEvent e){
                        if (jtabbedPane.getSelectedComponent() != null){
                            
                            JScrollPane scroll = (JScrollPane) jtabbedPane.getSelectedComponent();
                            panelDibujo = (JPanelDibujo) scroll.getViewport().getComponent(0);
                            Malla aux = obtenerMallaPorIdentificador(panelDibujo.getIdentificador());
                            int posicionMalla = encontrarIndiceMalla(aux);
                            mallaSeleccionada = mallas.get(posicionMalla);
                        }
            }
        });
        
        this.mallas = new ArrayList();
        //this.panelDibujo = new JPanelDibujo();

        this.setJMenuBar(new BarraMenu(this));
        this.createToolbar();

        super.add(this.jtabbedPane, BorderLayout.CENTER);
        this.archivo = new Archivo(this);
        this.vistaDatosRamo = new VistaDatosRamo(this, true);
       // this.operacionCerrar();
        setDefaultCloseOperation(WindowConstants.DO_NOTHING_ON_CLOSE);
        addWindowListener(new WindowAdapter() {
        public void windowClosing(WindowEvent we){
            int seleccion = JOptionPane.showConfirmDialog(null, "Desea Salir?");
            if(seleccion == 0){
                archivo.eliminarDescompresionZip();
                System.exit(0);
            }
        }
        });
        if( ruta != "" )
        {
            this.abrirRuta( ruta );
        }
    }
    
    public void abrirRuta( String ruta )
    {
        System.out.println(ruta);
        Malla malla = archivo.abrir( ruta );
        if(malla != null){
            malla.setIdentificador(this.identificador++);
            System.out.println("identificador malla "+malla.getIdentificador());
            this.mallas.add(malla);
            this.vistaDatosRamo.cargarBoxNiveles(malla.getDuracion());
            this.vistaDatosRamo.setMalla(malla);
            JPanelDibujo p2 = new JPanelDibujo(this.jtabbedPane);
            p2.setIdentificador(malla.getIdentificador());
            System.out.println("identificador panel "+p2.getIdentificador());
            p2.setOrientacion(malla.getOrientacion());
            p2.setNombreMalla(malla.getNombre());
            if( p2.getOrientacion() == 0 ) //Vertical = 0
                {
                    //p2.setPreferredSize(new Dimension(700, malla.getDuracion()*200 + 50 ));
                    p2.setPreferredSize(new Dimension(7*(150+20)+100, malla.getDuracion()*200 +50 ));
                }
            else if( p2.getOrientacion() == 1 ) //Horizontal = 1
                {
                    p2.setPreferredSize(new Dimension(malla.getDuracion()*200+50, 500 ));
                }
            p2.setCantidadSemestres(malla.getDuracion());
            p2.setVentana(this);
            this.tabs.put(malla.getIdentificador(), p2); // agrega la tab al hashmap de tabs
            p2.cargarCursos(malla);
            p2.cargarFlechas(malla.getFlechas());
            this.mallaSeleccionada = mallas.get(mallas.size()-1);
            JScrollPane scroll2 = new JScrollPane(p2);
            scroll2.getVerticalScrollBar().setUnitIncrement(16);
            scroll2.updateUI();
            ImageIcon icon2 = new ImageIcon(getClass().getResource("/images/typexy_16.png"));
            //this.jtabbedPane.addTab(formularioMalla.getNombre(), scroll);  // agrega visualmente la nueva tab
            this.jtabbedPane.addTab(malla.getNombre(), icon2, scroll2);
            this.repitarTitulos(this.jtabbedPane);
            this.toolbar.setVisible(true);  // habilita toolbar para ingresar ramos
            this.jtabbedPane.setSelectedComponent(scroll2);  // deja la tab recien creada como seleccionada
            panelDibujo = p2; // panel seleccionado
            //this.panelDibujo.updateUI();
            restablecerPreRequisitos();
        }
    }
    
    private Malla obtenerMallaPorIdentificador(int identificador){
        for(int i = 0; i < this.mallas.size(); i++){
            if(this.mallas.get(i).getIdentificador() == identificador){
                return this.mallas.get(i);
            }
        }
        return null;
    }
    
    private void createToolbar()
    {
        this.toolbar = new JToolBar(JToolBar.VERTICAL);
        ImageIcon abrir = new ImageIcon(getClass().getResource("/images/open.png"));
        ImageIcon nuevo = new ImageIcon(getClass().getResource("/images/new.png"));
        ImageIcon guardar = new ImageIcon(getClass().getResource("/images/save.png"));
        ImageIcon agregarRamo = new ImageIcon(getClass().getResource("/images/add.png"));
        ImageIcon eliminarRamo = new ImageIcon( getClass().getResource("/images/delete.png") );
        ImageIcon editarRamo = new ImageIcon( getClass().getResource("/images/edit.png") );
        ImageIcon deshacer = new ImageIcon( getClass().getResource("/images/undo.png") );
        ImageIcon rehacer = new ImageIcon( getClass().getResource("/images/redo.png") );
        ImageIcon imprimir = new ImageIcon( getClass().getResource("/images/imprimir.png") );
        ImageIcon orientacion = new ImageIcon( getClass().getResource("/images/orientacion.png") );

        ButtonGroup group = new ButtonGroup();
        group.add( this.createToolButton( toolbar, abrir, false, "Presione para abrir un proyecto", CommandNames.CAPTION_ITEM_ABRIR_PROYECTO) );
        group.add( this.createToolButton( toolbar, nuevo, false, "Presione para crear nuevo proyecto", CommandNames.CAPTION_ITEM_PROYECTO_NUEVO) );
        group.add( this.createToolButton( toolbar, guardar, false, "Presione para guardar proyecto", CommandNames.CAPTION_ITEM_GUARDAR) );
        group.add( this.createToolButton( toolbar, agregarRamo, false, "Presione para agregar un ramo", CommandNames.COMMAND_NUEVO_RAMO) );
        group.add( this.createToolButton( toolbar, eliminarRamo, false, "Presione para eliminar el ramo seleccionado", CommandNames.COMMAND_ELIMINAR_RAMO) );
        group.add( this.createToolButton( toolbar, editarRamo, false, "Presione para editar el ramo seleccionado", CommandNames.COMMAND_EDITAR_RAMO) );
        //group.add( this.createToolButton( toolbar, deshacer, false, "Presione para deshacer acción", CommandNames.COMMAND_DESHACER) );
        //group.add( this.createToolButton( toolbar, rehacer, false, "Presione para rehacer acción", CommandNames.COMMAND_REHACER) );
        group.add( this.createToolButton( toolbar, imprimir, false, "Presione para imprimir documento", CommandNames.COMMAND_IMPRIMIR) );
        group.add( this.createToolButton( toolbar, orientacion, false, "Presione para cambiar orientacion página", CommandNames.COMMAND_CAMBIAR_ORIENTACION) );

        toolbar.setVisible(false);
        this.add( toolbar, BorderLayout.WEST );
    }
    
    private JButton createToolButton( JToolBar toolbar, Icon icon, boolean state, String tooltip, String actionCommand )
    {
        JButton button = new JButton( icon );
        button.setSelected(state);
        button.setActionCommand(actionCommand);
        toolbar.add(button);
        button.addActionListener(this);
        button.setToolTipText(tooltip);
        return button;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        switch(e.getActionCommand()){
            case CommandNames.COMMAND_NUEVO_RAMO:
                if (this.jtabbedPane.getComponentCount() == 0) break;
                this.vistaDatosRamo.reset(panelDibujo.getNiveles());
                this.vistaDatosRamo.setMalla(mallaSeleccionada);
                this.vistaDatosRamo.setAgregar(true);
                this.vistaDatosRamo.getjPanelRamo1().resetearValidacion();
                this.vistaDatosRamo.setNombreEditando("");
                this.vistaDatosRamo.setVisible(true);  // ventana modal
                Ramo ramo = this.vistaDatosRamo.getRamo();
                if (vistaDatosRamo.getAceptado()){
                    if (ramo != null){
                        this.mallaSeleccionada.addRamo(ramo);
                        this.panelDibujo.ingresarRamo(ramo);
                        this.vistaDatosRamo.setAceptado(false);
                    }
                }
                this.panelDibujo.repaint();
                break;
            case CommandNames.COMMAND_ELIMINAR_RAMO:
                if (this.panelDibujo.getFigPresionada() != null){
                    this.panelDibujo.eliminarJFIgura(this.panelDibujo.getFigPresionada());
                    this.mallaSeleccionada.eliminarRamo(this.panelDibujo.getFigPresionada().getRamo());
                }
                break;
            case CommandNames.COMMAND_EDITAR_RAMO:
                if (this.panelDibujo.getFigPresionada() != null){
                    this.vistaDatosRamo.setAgregar(false);
                    this.mostrarVistaDatosRamo( this.panelDibujo.getFigPresionada().getNivel(), this.panelDibujo.getFigPresionada().getNombre() );
                }
                break;
            case CommandNames.COMMAND_CAMBIAR_ORIENTACION:
                System.out.println(this.tabs.get(this.panelDibujo.getIdentificador()).getOrientacion()+"   clocloclo");
                this.panelDibujo.cambiarOrientacion();
                if( this.panelDibujo.getOrientacion() == 1 ) //Vertical = 0
                {
                    this.panelDibujo.setPreferredSize(new Dimension(panelDibujo.getHeight(), panelDibujo.getWidth() ));  // maximo de 7 ramos por semestre
                }
                else if( this.panelDibujo.getOrientacion() == 0 ) //Horizontal = 1
                {
                    this.panelDibujo.setPreferredSize(new Dimension(panelDibujo.getWidth(), panelDibujo.getHeight()));
                }
                this.panelDibujo.updateUI();
                this.tabs.get(this.panelDibujo.getIdentificador()).setOrientacion(this.panelDibujo.getOrientacion());
                break;
            case CommandNames.COMMAND_CAMBIAR_NOMBRE:
                modificarNombreMalla();
                break;
            case CommandNames.CAPTION_ITEM_ABRIR_PROYECTO:
                Malla malla = archivo.abrir();
                if(malla != null){
                    malla.setIdentificador(this.identificador++);
                    System.out.println("identificador malla "+malla.getIdentificador());
                    this.mallas.add(malla);
                    this.vistaDatosRamo.cargarBoxNiveles(malla.getDuracion());
                    this.vistaDatosRamo.setMalla(malla);
                    JPanelDibujo p2 = new JPanelDibujo(this.jtabbedPane);
                    p2.setIdentificador(malla.getIdentificador());
                    System.out.println("identificador panel "+p2.getIdentificador());
                    p2.setOrientacion(malla.getOrientacion());
                    p2.setNombreMalla(malla.getNombre());
                    if( p2.getOrientacion() == 0 ) //Vertical = 0
                        {
                            //p2.setPreferredSize(new Dimension(700, malla.getDuracion()*200 + 50 ));
                            p2.setPreferredSize(new Dimension(7*(150+20)+100, malla.getDuracion()*200 +50 ));
                        }
                    else if( p2.getOrientacion() == 1 ) //Horizontal = 1
                        {
                            p2.setPreferredSize(new Dimension(malla.getDuracion()*200+50, 500 ));
                        }
                    p2.setCantidadSemestres(malla.getDuracion());
                    p2.setVentana(this);
                    this.tabs.put(malla.getIdentificador(), p2); // agrega la tab al hashmap de tabs
                    p2.cargarCursos(malla);
                    p2.cargarFlechas(malla.getFlechas());
                    this.mallaSeleccionada = mallas.get(mallas.size()-1);
                    JScrollPane scroll2 = new JScrollPane(p2);
                    scroll2.getVerticalScrollBar().setUnitIncrement(16);
                    scroll2.updateUI();
                    ImageIcon icon2 = new ImageIcon(getClass().getResource("/images/typexy_16.png"));
                    //this.jtabbedPane.addTab(formularioMalla.getNombre(), scroll);  // agrega visualmente la nueva tab
                    this.jtabbedPane.addTab(malla.getNombre(), icon2, scroll2);
                    this.repitarTitulos(this.jtabbedPane);
                    this.toolbar.setVisible(true);  // habilita toolbar para ingresar ramos
                    this.jtabbedPane.setSelectedComponent(scroll2);  // deja la tab recien creada como seleccionada
                    panelDibujo = p2; // panel seleccionado
                    //this.panelDibujo.updateUI();
                    restablecerPreRequisitos();
                }
                break;

            case CommandNames.CAPTION_ITEM_PROYECTO_NUEVO:
                //JOptionPane.showMessageDialog(this, CommandNames.CAPTION_ITEM_PROYECTO_NUEVO, this.getTitle(), JOptionPane.INFORMATION_MESSAGE);
                VistaMallaNueva formularioMalla = new VistaMallaNueva(this, true); // formulario de nueva malla
                formularioMalla.resetearValidacion();
                formularioMalla.setVisible(true);
                if (formularioMalla.esValido()){
                    this.vistaDatosRamo.cargarBoxNiveles(formularioMalla.getDuracion()); // carga el texbox niveles
                    malla = new Malla(formularioMalla.getNombre(),formularioMalla.getDuracion());
                    malla.setIdentificador(this.identificador++);
                    JPanelDibujo p = new JPanelDibujo(this.jtabbedPane);  // crea el nuevo panel que se agregara como tab
                    p.setIdentificador(malla.getIdentificador());
                    p.setNombreMalla( malla.getNombre() );
                    if( p.getOrientacion() == 0 ) //Vertical = 0
                    {
                        p.setPreferredSize(new Dimension(7*(150+20)+100, malla.getDuracion()*200 +50 ));
                    }
                    else if( p.getOrientacion() == 1 ) //Horizontal = 1
                    {
                        p.setPreferredSize(new Dimension(malla.getDuracion()*200 +50, 500 ));
                    }

                    p.setCantidadSemestres(malla.getDuracion());
                    p.setVentana(this);
                    this.tabs.put(malla.getIdentificador(), p); // agrega la tab al hashmap de tabs

                    this.mallas.add(malla); // agrega una malla al arraylist de mallas
                    this.mallaSeleccionada = mallas.get(mallas.size()-1);  // selecciona la malla recien creada
                    JScrollPane scroll = new JScrollPane(p);
                    scroll.getVerticalScrollBar().setUnitIncrement(16);
                    scroll.updateUI();
                    ImageIcon icon = new ImageIcon(getClass().getResource("/images/typexy_16.png"));
                    //this.jtabbedPane.addTab(formularioMalla.getNombre(), scroll);  // agrega visualmente la nueva tab
                    this.jtabbedPane.addTab(malla.getNombre(), icon, scroll);
                    this.repitarTitulos(this.jtabbedPane);
                    this.toolbar.setVisible(true);  // habilita toolbar para ingresar ramos
                    this.jtabbedPane.setSelectedComponent(scroll);  // deja la tab recien creada como seleccionada
                    panelDibujo = p; // panel seleccionado
                }
                break;
            case CommandNames.CAPTION_ITEM_GUARDAR:
                mallaSeleccionada.setFlechas(this.panelDibujo.getFlechas());
                this.mallaSeleccionada.setOrientacion(this.panelDibujo.getOrientacion());
                    
                if(!this.mallaSeleccionada.getRutaGuardado().equals("")){
                    Malla mallaAux = archivo.guardar(agregarCoordenadasRamo(this.mallaSeleccionada));//Primero agrega los datos a los ramos y luego envia la malla resultante a la funcion guardarComo.
                    this.agregarRutas(mallaAux);
                }
                else{
                    Malla mallaAux = archivo.guardarComo(agregarCoordenadasRamo(this.mallaSeleccionada));//Primero agrega los datos a los ramos y luego envia la malla resultante a la funcion guardarComo.
                    this.agregarRutas(mallaAux);
                }
                break;
            case CommandNames.CAPTION_ITEM_GUARDAR_COMO:
                Malla mallaAux;
                mallaSeleccionada.setFlechas(this.panelDibujo.getFlechas());
                this.mallaSeleccionada.setOrientacion(this.panelDibujo.getOrientacion());
                mallaAux = archivo.guardarComo(agregarCoordenadasRamo(this.mallaSeleccionada));//Primero agrega los datos a los ramos y luego envia la malla resultante a la funcion guardarComo.
                this.agregarRutas(mallaAux);
                break;
            case CommandNames.CAPTION_ITEM_IMPRIMIR:
                if (this.jtabbedPane.getComponentCount() == 0)
                    break;
                archivo.imprimir(this.panelDibujo);
                break;
            case CommandNames.CAPTION_ITEM_EXPORTAR:
                if (this.jtabbedPane.getComponentCount() == 0)
                    break;
                archivo.exportar(panelDibujo);
                break;
            case CommandNames.CAPTION_ITEM_SALIR:
                archivo.salir();
                break;
            case CommandNames.CAPTION_ITEM_AYUDA:
                archivo.ayuda();
                break;
            case CommandNames.CAPTION_ITEM_ACERCA_DE:
                JOptionPane.showMessageDialog(this,
                         "Creador de Mallas(C), 2013\n"
                        +"\nPrograma cuya función principal es\ncrear mallas universitarias, también"
                        +"\npuede ser utilizado como visor de\nestos archivos, sin embargo, la mejor"
                        +"\nexperiencia de uso para ello lo entrega\nla herramienta Visor de Mallas(C).\n"
                        +"\nProgramadores:\nAlejandro Naranjo\nMauricio Orellana\nFelipe Román\n"
                        +"\nVersion 1.00",this.getTitle(), JOptionPane.INFORMATION_MESSAGE);
                break;
            case CommandNames.COMMAND_AGREGAR_SEGMENTO:
                this.panelDibujo.agregarTramo();
                break;
        }
        
    }    
    /**
     * 
     * @param malla ingresa la malla que contiene los ramos a los cuales queremos agregar sus coordenadas y dimensiones.
     * @return Malla  retorna la malla con sus ramos correspondientes. Estos ya contendrán las coordenadas y dimensiones correspondientes.
     */
    public Malla agregarCoordenadasRamo(Malla malla){
        JPanelDibujo panel = this.tabs.get(malla.getIdentificador());//Obtiene el JPanelDibujo correspondiente a la malla.
        for(int i = 1; i <= malla.getRamos().size();i++){//Ciclo para recorrer todas las llaves que permiten obtener el ArrayList de ramos. 
           // ramos = malla.getRamosNivel(i);//Obtiene el ArrayList de ramos.
            if(malla.getRamos().containsKey(i)){
                for(int j = 0; j < malla.getRamosNivel(i).size();j++){//Ciclo para recorrer todos los ramos.

                    ArrayList<JFigura> figuras = panel.getFigures();//Obtiene todas las figuras que entregaran los datos a su ramo correspondiente.
                    for(JFigura figura:figuras){//Recorre todas las figuras.
                        if(malla.getRamosNivel(i).get(j).getNombre().equals(figura.getNombre())){//Pregunta si la figura corresponde al ramo actual.
                            malla.getRamosNivel(i).get(j).agregarCoordenadas(figura.getX(), figura.getY(), figura.getAlto(), figura.getAncho());//Agrega al ramo los datos necesarios.
                        }
                    }   
                }
            }

        }
        return malla;//Retorna la malla con los ramos correspondientes.
    }
    
    public void pedirDatosRamo(){
        this.vistaDatosRamo.setVisible(true);
    }
    
    public void mostrarVistaDatosRamo(int nivel, String nombre){
        Ramo ramo = mallaSeleccionada.getRamo(nivel, nombre); // ramo que hay en la malla
        vistaDatosRamo.mostrarInformacion(ramo);              // se muestra el ramo y se da la opcion de editar los campos
        vistaDatosRamo.setAgregar(true);
        vistaDatosRamo.setNombreEditando(ramo.getNombre());
        vistaDatosRamo.getjPanelRamo1().resetearValidacion(); 
        vistaDatosRamo.setVisible(true);
        Ramo ramoModificado = vistaDatosRamo.getRamo();       // se obtiene el ramo 
        if (!ramo.equals(ramoModificado) && vistaDatosRamo.getAceptado()){ // comprueba si se han realizado cambios en el ramo
            this.revisarPreRequisitos(ramo, ramoModificado);
            this.panelDibujo.eliminarFlechasAntiguas(ramo);
            if(this.revisarNivelTipo(ramo, ramoModificado) == false){ // diferentes
                this.panelDibujo.eliminarJFIgura(this.panelDibujo.buscarJFigura(ramo.nombre, ramo.nivel));
                this.mallaSeleccionada.eliminarRamo(ramo);
                ramoModificado.eliminarPreRequisitos();
            }
            else{
                this.mallaSeleccionada.actualizarRamo(ramo, ramoModificado);
                this.panelDibujo.nombres();
                this.panelDibujo.agregarMemoria();
                this.panelDibujo.agregarFlechas(this.panelDibujo.buscarJFigura(ramoModificado.getNombre(), ramoModificado.getNivel()));
                this.panelDibujo.repaint();
            }
        } else {
            System.out.println("el ramo es el mismo");
            
        }
    }

    void eliminarRamo(Ramo ramo) {
        this.mallaSeleccionada.eliminarRamo(ramo);
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void keyPressed(KeyEvent e) {
//         if (e.isControlDown()){
//            if ((e.getKeyCode() == KeyEvent.VK_Z)) {
//                //System.out.println("deshacer");
//                this.panelDibujo.deshacer();
//            }
//        }
        if( e.getKeyCode() == KeyEvent.VK_DELETE )
        {
            this.panelDibujo.eliminarJFIgura(this.panelDibujo.getFigPresionada());
            this.mallaSeleccionada.eliminarRamo(this.panelDibujo.getFigPresionada().getRamo());
        }
        if (e.getKeyCode() == KeyEvent.VK_F1){
            this.archivo.ayuda();
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    public HashMap<Integer, JPanelDibujo> getTabs() {
        return tabs;
    }

    public void setTabs(HashMap<Integer, JPanelDibujo> tabs) {
        this.tabs = tabs;
    }
    
    public ArrayList<Malla> getMallas() {
        return mallas;
    }

    public void setMallas(ArrayList<Malla> mallas) {
        this.mallas = mallas;
    }

   public  void agregarRutas(Malla mallaAux) {
       int indiceMalla = this.encontrarIndiceMalla(mallaAux);
       if( indiceMalla != -1){
           for(int i = 1; i <= mallaAux.getDuracion();i++){//Ciclo que recorre los años de duración de la carrera.
                if (mallaAux.getRamos().containsKey(i)){//Verificamos si existe un año con algun curso ya inscrito.
                    for(int j = 0; j < mallaAux.getRamosNivel(i).size();j++){//Recorre todas los ramos para el año correspondiente.
                        this.mallas.get(indiceMalla).getRamosNivel(i).get(j).setRutaFicha(mallaAux.getRamosNivel(i).get(j).getRutaFicha());
                    }
                }
           }
       }
       //this.setMallaSeleccionada(mallaAux);
    }
    
   /**public void operacionCerrar(){
        super.addWindowListener(new WindowAdapter() {
        public void windowsClosing(WindowEvent we){
            System.out.println("aqui!");
            archivo.eliminarDescompresionZip();
            System.exit(0);
        }
        });
   }**/
   public int encontrarIndiceMalla(Malla mallaAux){
        for(int i = 0; i < this.mallas.size();i++){
            if(mallaAux.getIdentificador() == this.mallas.get(i).getIdentificador()){
                return i;
            }
        }
        return -1;
   }

    public Malla getMallaSeleccionada() {
        return mallaSeleccionada;
    }

    public void setMallaSeleccionada(Malla mallaSeleccionada) {
        this.mallaSeleccionada = mallaSeleccionada;
    }

    public int getIdentificador() {
        return identificador;
    }

    
    private void repitarTitulos(JTabbedPane jtabbedPane) {
        if (jtabbedPane.getComponentCount() == 1){
            this.jtabbedPane.setTabComponentAt(0, new ButtonTabComponent(this.jtabbedPane, this));
        }
        else {
            for (int i=0; i<jtabbedPane.getComponentCount()-1; i++){
                this.jtabbedPane.setTabComponentAt(i, new ButtonTabComponent(this.jtabbedPane, this));
            }
        }
    }

    private void revisarPreRequisitos(Ramo ramo, Ramo ramoModificado) {
        ArrayList<Ramo> requisitosRamo = ramo.getPreRequisitos();
        ArrayList<Ramo> requisitosRamoModificado = ramoModificado.getPreRequisitos();
        for (Ramo r : requisitosRamo){
            if (!requisitosRamoModificado.contains(r)){
                System.out.println("- nombre " + r.nombre );
                System.out.println("- nivel  " + r.nivel);
                this.panelDibujo.buscarJFigura(r.nombre, r.nivel).eliminarFlecha(ramo);
            }
        }
    }

    /**
     * retorna verdadero cuando son iguales
     * returna falso si nivel o periodo son diferentes
     */
    private boolean revisarNivelTipo(Ramo ramo, Ramo ramoModificado) {
        if (ramo.nivel != ramoModificado.nivel || !ramo.periodo.equals(ramoModificado.periodo)){
            this.mallaSeleccionada.addRamo(ramoModificado);
            this.panelDibujo.ingresarRamo(ramoModificado);
            //ramoModificado.eliminarPreRequisitos();
            for (Ramo r : ramoModificado.ramosRequisitos){
                System.out.println("eliminar las flechas que salen de " + r.nombre + " y llega a " + ramoModificado.nombre);
                this.panelDibujo.buscarJFigura(r.nombre, r.nivel).eliminarFlecha(ramoModificado);
            }
            return false;
        }
        return true;
    }

    private void restablecerPreRequisitos() {
        if (mallaSeleccionada != null){
            System.out.println("hay " + mallaSeleccionada.cantidadRamos() + " ramos");
            System.out.println("hay " + this.panelDibujo.getFlechas().size() + " flechas");
            mallaSeleccionada.eliminarPrerequisitos();
            for (JFigura fig : this.panelDibujo.figures){ // para cada figura
                int i=0;
                for (Flecha flecha : fig.flechas){ // para cada flecha
                    this.panelDibujo.buscarJFigura(flecha.llegada().nombre, flecha.llegada().nivel).getRamo().agregarRequisito(fig.getRamo());
                    flecha.setRamoPartida(fig.getRamo());
                    //flecha.setRamoLlegada(fig.flechas.get(0).llegada());
                    flecha.setRamoLlegada(fig.flechas.get(i).llegada());
                    i++;
                }
            }
        }
    }
    
    private void modificarNombreMalla()
    {
        if( mallaSeleccionada != null )
        {
            VistaModificarNombre vmn = new VistaModificarNombre( this, true, mallaSeleccionada.getNombre());
            vmn.setVisible(true);
            String nombreNuevo = vmn.getNuevoNombre();
            mallaSeleccionada.setNombre(nombreNuevo);
            this.jtabbedPane.setTitleAt(mallaSeleccionada.getIdentificador(), nombreNuevo);
            this.jtabbedPane.setEnabledAt(mallaSeleccionada.getIdentificador(), true);
            this.jtabbedPane.setSelectedIndex(mallaSeleccionada.getIdentificador());
            this.jtabbedPane.updateUI();
            this.panelDibujo.setNombreMalla(nombreNuevo);
        }
    }

}